package main

import (
	"fmt"
	"time"
)

func putNum(intChan chan int) {
	for i := 0; i < 80000; i++ {
		intChan <- i
	}
	close(intChan)
}
func primeNum(intChan chan int, primeChan chan int, exitChan chan bool) {
	var flag bool
	for {
		num, ok := <-intChan
		if !ok {
			break
		}
		//判断num是否为素数
		flag = true
		for i := 2; i < num; i++ {
			if num%i == 0 {
				flag = false
				break
			}
		}
		if flag == true {
			//将num放入prime
			primeChan <- num
		}
	}
	fmt.Println("有一个primeNum取不到数据，跳出")
	//这里不能关不primeNum，只能网exit写入true
	exitChan <- true
}
func main() {
	intChan := make(chan int, 1000)
	primeChan := make(chan int, 10000) //放入结果
	exitChan := make(chan bool, 4)
	//开启携程，向intchan放入数据
	start := time.Now().Unix()
	go putNum(intChan)
	//开启四个协程，从intchan取出数据，判断是否为素数，如果是，就放入prime
	for i := 0; i < 4; i++ {
		go primeNum(intChan, primeChan, exitChan)
	}
	//主线程进行处理
	go func() {
		//当从exitchan取出了4个结果，就可以关闭primeNum
		for i := 0; i < 4; i++ {
			<-exitChan
		}
		close(primeChan)
	}()
	end := time.Now().Unix()
	fmt.Printf("使用写成用时为%v", end-start)
	//遍历primeNum,把结果取出来
	for {
		_, ok := <-primeChan
		if !ok {
			break
		}
		/*fmt.Printf("素数有：%d\n", res)*/
	}
	fmt.Println("主线程退出")
}
